// Promise是一个构造函数
//  构造函数有两个属性。PromiseState   PromiseResult

function Promise(executor){
    this.PromiseState = 'pending';
    this.PromiseResult = undefined;
    // 增加一个属性，用来存放成功或失败的回调函数
    this.callbacks = [];

    let resolve = (value)=>{
        if(this.PromiseState !== 'pending') return;
        this.PromiseState = 'fulfilled';
        this.PromiseResult = value;
        // 这里是确定的成功的状态，但是我却无法获取成功的回调进行执行
        // 在这里执行 callbacks中存储的所有的成功的回调函数
        this.callbacks.forEach(item=>{
            item.success();
        })
    }
    let reject = (reason)=>{
        if(this.PromiseState !== 'pending') return;
        this.PromiseState = 'rejected';
        this.PromiseResult = reason;
        // 这里是确定的失败的状态，但我却无法获取失败的回调执行
        this.callbacks.forEach(item=>{
            item.fail();
        })
    }
    try{
        executor(resolve,reject);
    }catch(e){
        reject(e);
    }
}
// 1. 添加then方法
// 2. 在哪里添加？
/**
 * 
 * @param {*} onResolved : 成功的回调
 * @param {*} onRejected ： 失败的回调
 */
Promise.prototype.then = function(onResolved, onRejected){
    console.log(this.PromiseState);
    // 如果状态是成功的，那么执行then成功的回调
    if(this.PromiseState === 'fulfilled'){
        // 将成功的结果值传递
        onResolved(this.PromiseResult);
    }
    // 如果状态是失败的，那么执行失败的回调
    if(this.PromiseState === 'rejected'){
        // 将失败的结果值传递
        onRejected(this.PromiseResult);
    }
    // 如果 this.PromiseState === 'pending' 说明是异步任务
    if(this.PromiseState === 'pending'){
        console.log('我该执行成功呢？还是失败呢?');
        // 在这里执行成功 或 失败的回调都不合适？因为状态不确定
        // 那在哪里执行状态是确定的呢？【resolve和reject中】
        // 但在此处，我可以获得成功和失败的回调函数
        // 解决方案：在此处将成功和失败的回调函数存放在 this.callbacks属性中，然后再 resolve 和reject 函数中取出来进行执行
        this.callbacks.push({
            // 此处要使用箭头函数，因为this要指向 promise实例对象
            success:()=>{
                onResolved(this.PromiseResult);
            },
            fail:()=>{
                onRejected(this.PromiseResult);
            }
        })
    }
}